package com.hspedu.furns.web;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

/**
 * @author 徐
 * @version 1.0
 * 抽象类模板设计模式，把doPost提取到父类，通过继承的机制，
 * 执行父类的doPost方法，利用反射+动态绑定 来执行子类的具体处理方法
 */
public abstract class BasicServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        //System.out.println("BasicServlet被调用...");
        //获取到表单携带的action对象，用来判断业务类型
        //提示：如果我们使用了模板模式+反射+动态绑定，要满足action的value 和 方法名一致!!!
        String action = request.getParameter("action");

        //使用反射,获取当前对象的方法
        //说明
        //1.this 就是请求的Servlet
        //2.declaredMethod 方法对象就是当前请求的servlet对应的"action名字" 的方法, 该方法对象(declaredMethod)
        //  是变化的,根据用户请求
        //3.使用模板模式+反射+动态机制===> 简化多个 if--else if---..
        try {
            Method declaredMethod = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
            System.out.println("declaredMethod=" + declaredMethod);
            //使用方法对象，反射调用
            declaredMethod.invoke(this,request,response);
        } catch (Exception e) {
            //继续抛出，发生的异常
            //让TransactionFilter过滤器来捕获到异常才能回滚
            //如果此处直接捕获，后面就不会继续捕获
            throw new RuntimeException(e);
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}
